#!/usr/bin/env python
# coding: utf-8

# In[ ]:





# # 上周回顾
# ##  1.1 Json(文本数据)----> Dict(python中的字典数据)
# ##  1.2 字典和列表的综合实践

# # 2.本周内容:
# ## 2.1[集合]（https://docs.pythin.org/3/tutoriak/datastructures.html#sets）
# * 思考：我想了解一组数据中有哪些唯一存在的值？（假如是列表）
# * 1.集合的性质
# ** 1.无序(unordered)
# ** 2.不重复的(no duplicate)
# * 2.集合的一般方法
# ** 1.增加
# ** 2.删除
# ** 3.查询： in 查询成员的关系
# * 3.集合的数学逻辑运算

# In[38]:


no_duplicate_age = []
list_age = [18,24,25,24,18,23,18]
for i in list_age:
    if i not in no_duplicate_age:
        no_duplicate_age.append(i)


# In[39]:


no_duplicate_age


# In[40]:


# list ----> set 的方法： set（）
no_duplicate_age_set = set(list_age)
print(no_duplicate_age_set)


# In[41]:


# 官方文档测试代码
# 1. 移除重复项
basket = {'apple','orange','apple','pear','orange','banana'}
print(basket)
# 2. in 查询成员关系
print('orange' in basket)
print('crabgrass' in basket)


# ## 2. 集合的一般方法

# * 集合的创建的两种一般方法：
# > 1. set(list)
# > 2. 直接按照集合的结构创建：{value1,value2,value3...}

# > 1. 增加
# >> 1. 结果：add an element to a set
# >> 2. 注意：This has no effect if the element is already present.

# In[42]:


set_1 = set([1,3,4,0,8,66,7])
print(set_1)


# In[43]:


help(set_1.add)


# In[44]:


set_1.add(99)
print(set_1.add)


# In[45]:


set_1.add(66)
print(set_1.add)


# > 2. 删除
# >> 1.pop():Remove and return an arbitrary set element. Raises KeyError if the set is empty.
# 
# >> 2.remove():
# 
# >> 3.discard():    

# In[46]:


help(set_1.pop)


# In[47]:


# 1. Remove and return an arbitrary set element. 随机删除
print(set_1)
set_1.pop()
print(set_1)


# In[48]:


# 2. Raises KeyError if the set is empty.
set_2 = set([])
set_2.pop()


# In[49]:


help(set_1.remove)


# In[50]:


# 1. Remove an element from a set; it must be a member.
print(set_1)
set_1.remove(66)
print(set_1)


# In[51]:


# 2.  If the element is not a member, raise a KeyError. 一般项目中 remove（）会和 in 共同使用
set_1.remove(66)


# In[52]:


# * 避免keyerror的方式：
if 66 in set_1:
    set_1.remove(66)


# In[53]:


help(set_1.discard)


# In[54]:


print(set_1)


# In[55]:


help(set_1.remove)


# ### 3. 集合的运算
# > 1.集合的交集
# 
# > 2.集合的并集
# 
# > 3.集合的差集

# In[56]:


set_1 = set([1,2,5,6,7,2,3,2,4,4])
set_2 = set([1,3,4,0,8,66,7])
print("set_1:",set_1)
print("set_2:",set_2)


# > 1.集合的交集
# >> 1.使用集合的方法： set_1.intersection（set_2）
# 
# >> 2.使用逻辑运算符：set_1 & set_2

# In[57]:


help(set_1.intersection)


# In[58]:


# 使用集合的方法： set_1.intersection（set_2）
print("set_1:",set_1)
print("set_2:",set_2)
print("交集结果:",set_1.intersection(set_2))


# In[59]:


# 使用逻辑运算符：set_1 & set_2
print("set_1:",set_1)
print("set_2:",set_2)
print("交集结果:",set_1 & set_2)


# In[60]:


# 实践 :
set_1_xu = {"星期一8-10","星期二3-5","星期三12-14"}
set_2_前端 = {"星期三12-14","星期三3-5"}


# > 1.集合的并集
# >> 1.使用并集的方法： set_1.union（set_2）
# 
# >> 2.使用逻辑运算符：set_1 | set_2

# In[61]:


# 使用并集的方法： set_1.union（set_2）
print("set_1:",set_1)
print("set_2:",set_2)
print("交集结果:",set_1.union (set_2))


# In[62]:


# 使用逻辑运算符：set_1 | set_2
print("set_1:",set_1)
print("set_2:",set_2)
print("交集结果:",set_1 | set_2)


# In[63]:


# 计算运行效率 = 运行后的时间节点 - 运行前的实践节点
import time
start_time = time.time()
print("开始的时间：",start_time)
print("set_1:",set_1)
print("set_2:",set_2)
print("交集结果:",set_1 | set_2)
stop_time = time.time()
print("结束时间:",stop_time)
print("运行时间:",stop_time - start_time)


# > 1.集合的差集（考虑先后顺序）
# >> 1.使用差集的方法： set_1.difference（set_2）
# 
# >> 2.使用逻辑运算符：set_1 - set_2

# In[64]:


print("set_1:",set_1)
print("set_2:",set_2)
print("set_1 和 set_2 差集结果:",set_1.difference(set_2))


# In[65]:


print("set_1:",set_1)
print("set_2:",set_2)
print("set_2 和 set_1 差集结果:",set_2.difference(set_1))


# In[66]:


print("set_1:",set_1)
print("set_2:",set_2)
print("set_2 和 set_1 差集结果:",set_2 - set_1)


# > 1.对称差集
# >> 1.用对称差集的方法： set_1.symmetric_difference（set_2）
# 
# >> 2.使用逻辑运算符：？ (set_1 - set_2) | (set_2 - set_1)

# In[67]:


help(set_1.symmetric_difference)


# In[79]:


print("set_1:",set_1)
print("set_2:",set_2)
print("对称差集结果:",set_1.symmetric_difference(set_2))


# ### 集合实践

# In[95]:


vowels = set('aeiou') 
word = input("Provide a word to search for vowel:")
found = vowels.intersection(set(word))
print(found)


# ### 课后作业：
# >. 1.课堂练习
# >. 2.课本第三章 课后项目作业
# >. 3.总结集合方法

# ## 2.课本第三章课后

# In[83]:


vowels = {'i', 'o', 'u', 'a', 'e'}
word = input("Provide a word to search for vowels:")

found = {}


# In[84]:


for letter in word:
    if letter in vowels:
        found[letter] += 1


# In[85]:


for k,v in sorted(found.items()):
    print(k, 'was found',v, 'time(s).')


# In[86]:


print(sorted)


# In[87]:


i


# # 3.总结集合方法

# # 1.集合的性质
# 1.无序(unordered)
# 
# 2.不重复的(no duplicate)
# 
# 
# # 2.集合的一般方法
# ## 1.增加
# >> 1. 结果：add an element to a set
# 
# >> 2. 注意：This has no effect if the element is already present.
# ## 2.删除
# >> 1.pop():Remove and return an arbitrary set element. Raises KeyError if the set is empty.
# 
# >> 2.remove():
# 
# >> 3.discard():    
# ## 3.查询： in  查询成员的关系
# 
# 
# 
# # 3.集合的数学逻辑运算
# ## 1.集合的交集
# >> 1.使用集合的方法： set_1.intersection（set_2）
# 
# >> 2.使用逻辑运算符：set_1 & set_2
# 
# ## 2.集合的并集
# >> 1.使用并集的方法： set_1.union（set_2）
# 
# >> 2.使用逻辑运算符：set_1 | set_2
# 
# ## 3.集合的差集
# >> 1.使用差集的方法： set_1.difference（set_2）
# 
# >> 2.使用逻辑运算符：set_1 - set_2

# In[ ]:
